[レポート]Boost your Kubernetes journey with EKS Blueprints for CDK & Amazon Q #NTA304-R #AWSreInvent

[レポート]Boost your Kubernetes journey with EKS Blueprints for CDK & Amazon Q #NTA304-R #AWSreInvent

CDK と生成 AI を利用した EKS クラスターの作り方を教えてくれるっていうので、行ってきました!

セッション概要

タイトル
NTA304-R | Boost your Kubernetes journey with EKS Blueprints for CDK & Amazon Q

説明
Bootstrapping and operating Kubernetes environments can be complex, from selecting the right open source tools to implementing multi-tenancy and security controls. In this hands-on workshop, learn how to use Amazon EKS Blueprints for CDK, a collection of infrastructure-as-code modules, to rapidly provision and configure an Amazon EKS cluster for a microservices application. Discover how Amazon Q can assist you in writing and modifying the AWS CDK code to streamline infrastructure provisioning. Learn how to deploy and configure a ready-to-use Amazon EKS cluster using continuous deployment automation, allowing you to scale the provisioning and maintenance of Amazon EKS clusters across your organization efficiently. You must bring your laptop to participate.

スピーカー
Camilo Cortes, Sr Solutions Architect, Amazon Web Services
Gabriel Montero, Sr Solution Architect, AWS

アジェンダ

まず EKS Blueprints と Q Developer の説明

  • What is Amazon EKS Blueprints
  • Intro to Amazon Q Developer

その後、下記ハンズオンを進めていきます。

https://catalog.us-east-1.prod.workshops.aws/workshops/6f702488-15af-4f41-9f87-e11664abc424/en-US

EKS Blueprints について

簡単に EKS を作成できるオープンソースのフレームワークとして紹介されていました。

https://github.com/aws-quickstart/cdk-eks-blueprints

ベストプラクティスに沿ったクラスターを作成でき、好きなアドオンを入れながら利用していけるといった旨の内容でした。
Terraform の方は触ったことがあったのですが、CDK の方は触ったことが無かったのでワクワクしながら聞いてました。

https://github.com/aws-ia/terraform-aws-eks-blueprints

Q Developer について

生成 AI を利用して、CDK コードを生成したり、コードを説明させたりできますよという旨の内容でした。今回は CDK で EKS クラスターを定義しますが、そのコード修正を Q Developer を用いて行っていくことになります。

クラスター作成

CDK のプロジェクトを作成します。

mkdir my-eks-blueprints
cd my-eks-blueprints
cdk init app --language typescript

Blueprints をインストールします。

npm install @aws-quickstart/eks-blueprints@1.15.1

Q Developer に CDK で Bootstrap を作りたいといった旨を伝えると生成してくれました。

#!/usr/bin/env node
import * as cdk from 'aws-cdk-lib';
import * as blueprints from '@aws-quickstart/eks-blueprints';

const app = new cdk.App();
const account = process.env.CDK_DEFAULT_ACCOUNT!;
const region = process.env.CDK_DEFAULT_REGION!;
const blueprint = blueprints.EksBlueprint.builder()
  .account(account)
  .region(region)
  .addOns()
  .teams()
  .build(app, 'eks-blueprint');

最初は下記エラーがでたのですが、エラー分をそのままチャットに投げたら回答してくれました。

throw new Error("Version was not specified by cluster builder or in cluster provider props, must be specified in one of these");

バージョン指定が無いので指定しましたということでコピペして、デプロイを進めます。.version('auto') と指定すると latest 扱いだそうです。

This error occurs when trying to deploy an EKS cluster using the EKS Blueprints framework without specifying the Kubernetes version. Looking at your open file, I notice that the cluster configuration is missing the version specification.

Here's how you can fix this by adding the version parameter to your blueprint configuration:

#!/usr/bin/env node
import * as cdk from 'aws-cdk-lib';
import * as blueprints from '@aws-quickstart/eks-blueprints';

const app = new cdk.App();
const account = process.env.CDK_DEFAULT_ACCOUNT!;
const region = process.env.CDK_DEFAULT_REGION!;
const blueprint = blueprints.EksBlueprint.builder()
  .account(account)
  .region(region)
  .version('auto')  // This will use the latest EKS version
  // Or specify a specific version like:
  // .version(blueprints.eks.KubernetesVersion.V1_27)
  .addOns()
  .teams()
  .build(app, 'eks-blueprint');

Copy

Insert at cursor
typescript
You have two options for specifying the version:

Use 'auto' to automatically select the latest available EKS version

Explicitly specify a version using blueprints.eks.KubernetesVersion enum

If you need to use a specific version, you can choose from the available versions like V1_27, V1_26, etc. It's recommended to explicitly specify the version in production environments to have better control over cluster upgrades.

Make sure to consider your requirements regarding version-specific features and compatibility with your workloads when choosing a Kubernetes version.

無事クラスター作成が完了します。
ハンズオンに無い手順でしたが、生成 AI が全て解決してくれました。CDK と生成 AI を活用した EKS クラスター管理、ありだな...と思いました。
ちなみに私は EKS クラスターを管理する際、こんな感じの考えでした。

Terrform:ファーストチョイス
CDK:EKS クラスターは Terraform の方が管理しやすいのでは?という謎の先入観で触ったことない
eksctl:ちょっとした検証に利用

CDK と生成 AI による補完は本当に気持ちよく、eksctl に近しいスピード感であっという間に EKS クラスターが立ち上がりました。
その後はアドオンを入れたりしていきます。

// lib/module2-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as blueprints from '@aws-quickstart/eks-blueprints';

export default class ClusterConstruct extends Construct {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id);

    const account = props?.env?.account!;
    const region = props?.env?.region!;

    const blueprint = blueprints.EksBlueprint.builder()
    .version('auto')
    .account(account)
    .region(region)
    .addOns(
      new blueprints.addons.VpcCniAddOn(),
      new blueprints.addons.MetricsServerAddOn(), // Add this line
      new blueprints.addons.CoreDnsAddOn() // Add this line
    )
    .teams()
    .build(scope, id+'-stack');
  }
}

diff はこんな感じ。

ubuntu@dev:~/eksPoweredByQ/module2$ npx cdk diff ClusterStack-stack
DEBUG Core add-on vpc-cni is at version auto
DEBUG Core add-on coredns is at version auto
DEBUG Core add-on coredns has autoselected version v1.11.1-eksbuild.4
DEBUG Core add-on vpc-cni has autoselected version v1.19.0-eksbuild.1
Stack ClusterStack-stack
Resources
[+] Custom::AWSCDK-EKS-HelmChart ClusterStack-stack/chart-metrics-server/Resource ClusterStackstackchartmetricsserverC7B4A41C
[+] AWS::EKS::Addon coredns-addOn corednsaddOn
[+] AWS::EKS::Addon vpc-cni-addOn vpccniaddOn

Stack ClusterStack-stack-awscdkawseksClusterResourceProviderNestedStackawscdkawseksClusterRe-1DOB0O8AYGAGU
There were no differences
Stack ClusterStack-stack-awscdkawseksKubectlProviderNestedStackawscdkawseksKubectlProviderNe-19444A9O3JV6Z
There were no differences

✨  Number of stacks with differences: 1

無事、入ってました。

$ kubectl get all -A
NAMESPACE     NAME                                                   READY   STATUS    RESTARTS   AGE
kube-system   pod/aws-node-rlw4q                                     2/2     Running   0          2m30s
kube-system   pod/blueprints-addon-metrics-server-64788bd6b5-65cg2   1/1     Running   0          2m21s
kube-system   pod/coredns-5b8cc885bc-gzrzg                           1/1     Running   0          18h
kube-system   pod/coredns-5b8cc885bc-kgdfp                           1/1     Running   0          18h
kube-system   pod/kube-proxy-7lzp2                                   1/1     Running   0          18h

NAMESPACE     NAME                                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default       service/kubernetes                        ClusterIP   172.20.0.1       <none>        443/TCP                  18h
kube-system   service/blueprints-addon-metrics-server   ClusterIP   172.20.195.108   <none>        443/TCP                  2m21s
kube-system   service/eks-extension-metrics-api         ClusterIP   172.20.204.12    <none>        443/TCP                  18h
kube-system   service/kube-dns                          ClusterIP   172.20.0.10      <none>        53/UDP,53/TCP,9153/TCP   18h

NAMESPACE     NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
kube-system   daemonset.apps/aws-node     1         1         1       1            1           <none>          18h
kube-system   daemonset.apps/kube-proxy   1         1         1       1            1           <none>          18h

NAMESPACE     NAME                                              READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/blueprints-addon-metrics-server   1/1     1            1           2m21s
kube-system   deployment.apps/coredns                           2/2     2            2           18h

NAMESPACE     NAME                                                         DESIRED   CURRENT   READY   AGE
kube-system   replicaset.apps/blueprints-addon-metrics-server-64788bd6b5   1         1         1       2m21s
kube-system   replicaset.apps/coredns-5b8cc885bc                           2         2         2       18h

その後も、ひたすらアドオンを追加していきます。

        new blueprints.addons.AwsLoadBalancerControllerAddOn(), // Add this line
        new blueprints.addons.CertManagerAddOn(), // Add this line
        new blueprints.addons.AdotCollectorAddOn(), // Add this line

これは AWS レイヤーだから、この設定は Kubernetes レイヤーだからとか考えずにサクサク進むのが良いですね。
Blueprints を利用することで、全て CDK が良い感じにしてくれる形になり、最高です。

単一のアドオンだけではなく、特定の機能がプリセットになっている Builder も利用可能です。

https://aws-quickstart.github.io/cdk-eks-blueprints/builders/

今回は Observability Builderを利用しました。

// lib/module2-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as blueprints from '@aws-quickstart/eks-blueprints';
import { ObservabilityBuilder } from '@aws-quickstart/eks-blueprints';

export default class ClusterConstruct extends Construct {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id);
    const account = props?.env?.account!;
    const region = props?.env?.region!;

    ObservabilityBuilder.builder()
        .account(account)
        .region(region)
        .version('auto')
        .enableNativePatternAddOns()
        .enableControlPlaneLogging()
        .addOns(
          new blueprints.addons.CloudWatchLogsAddon({
            logGroupPrefix: `/aws/eks/${id}-stack`,
            logRetentionDays: 30
          }),
          new blueprints.addons.VpcCniAddOn(),
          new blueprints.addons.XrayAddOn()
        )
        .build(scope, id+'-stack');
    }
}

上記定義をするだけで Container Insights with enhanced observability for Amazon EKS の設定が完了し、立派なダッシュボードが出来上がります。

スクリーンショット 2024-12-03 2.22.20.png

その後は Security Hub や Guardduty 等も活用してセキュアに利用する流れになります。
Blueprints を使っているだけで、その他は普通の CDK なので Security Hub や GuardDuty のセットアップ方法はいつも通りって感じです。
この辺りは、同じ CDK で扱える BLEA と組み合わせて使うのも手だよなぁと思いながらやってました。

感想

前述の通り、CDK で EKS を作成する機会は無かったのですが、今まで何で使わなかったんだろうというくらい楽でした。
CDK × Blueprints × 生成 AI の開発体験を簡単に体験できるので、余裕がある方はハンズオンも是非やってみて下さい!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.